package main

import "fmt"

// defer语句
// defer语句会将其后面跟随的语句进行延迟处理。在defer归属的函数即将返回时
// 将延迟处理的语句按照defer定义的逆序进行执行，也就是说，先被defer的语句
// 最后被执行，最后被defer的语句，最先被执行。

// defer多用于函数结束之前释放资源
func deferDemo() {
	fmt.Println("start")
	defer fmt.Println("嘿嘿嘿") // defer 把后面的语句延迟到函数即将返回的时候再执行
	defer fmt.Println("呵呵呵") // 一个函数中可以有多个defer语句
	defer fmt.Println("哈哈哈") // 多一个defer语句按照 先进后出（后进先出） 的顺序执行
	fmt.Println("end")
}

// defer执行时机
// 函数中return执行： 返回值赋值 返回值=x  => RET指令
// defer语句执行时机 return 返回值赋值 返回值=x  =>  运行defer  => RET指令

func main() {
	deferDemo()
}
